package com.tedu.api.thread;

import org.junit.Test;

/**
 * 线程常用API：四
 * join()    线程同步
 * 作用：允许一个线程再另一个线程上等待，执行完毕上一个线程，执行当前线程!
 *
 * join常用在线程协调之间同步操作！
 *
 * 同步运行：执行先后顺序
 * 异步运行：执行代码没有先后顺序，鸽子执行自己的代码块（多线程）
 *
 * 需求：模拟下载功能：下载“图片”---1%~100%-----单一流程：线程
 *                  【下载完毕之后】
 *                  显示“图片”-----单一流程：线程------共享状态变量
 *     同步运行：执行完毕下载图片操作，显示图片操作
 *
 */
public class Thread_join {
    //图片是否下载完毕：共享状态变量-----线程同步  true下载完毕，false没有下载完毕
    public static boolean isFinish=false;

    public static void main(String[] args) {
        //创建  下载线程，功能：1%~100%  下载百分比  download
        System.out.println("下载：开始下载图片");
        Thread download=new Thread(()->{
            for(int i=1;i<101;i++){
                System.out.println("下载"+i+"%");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            isFinish=true;//当百分比到达100%   下载状态改为true  下载完毕

        });
        download.start();
                //创建  显示线程，功能：显示图片  下载完毕之后显示  show
                System.out.println("准备显示图片中.....");
                Thread show=new Thread(()->{
                    try {
                        download.join();//同步：先执行download在执行show
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //3.如果图片没有加载完毕，----提示：打开失败，主动抛出异常
                    if(!isFinish){ //false---图片正常下载---提示
                        throw new RuntimeException("加载图片失败~~");
                    }
                    System.out.println("恭喜：图片加载完毕~");
                });
           show.start();
            }
        }


